/*
 * protocol_can.h
 *
 *  Created on: 2018-4-9
 *      Author: root
 */

#ifndef PROTOCOL_CAN_H_
#define PROTOCOL_CAN_H_
#ifdef __cplusplus
extern "C"{
#endif

#include "share_type.h"
struct canlink
{
   u8 addr;
   int qid;
    struct canlink * pNext;
};


typedef struct
{
	unsigned char port;	// 端口号 0,1
	unsigned char frm_gunno;	   //数据帧枪号
	unsigned char cha_addr;	// 控制器can地址 默认0xf6
	unsigned char tcu_addr;	//tcu地址 默认0x8a

}Gun_Can_Info;


typedef struct
{
	unsigned char priority;
	unsigned char pf;
	unsigned char ps;
	unsigned char sa;
	unsigned char lendata;
	unsigned char pdata[128];
}GW_Can;
typedef struct
{
	unsigned char ctrltype;	//  01：功率绝对值  02：百分比
	unsigned char optmod;	// 工作模式00：功率分配默认模  1共充  2按数据设置
	unsigned int ctrlvalue;	//功率分配数值
    unsigned char   result;    // 成功标识

}ctrlpw_bak;
union u_out_mx{  //来自充电控制器
	struct{
		short 		MX[64];						/*充电输出电压 0
												  充电输出电流    1
												  SOC                                                                     2
												  电池组最低温度                                                  3
												  电池组最高温度                                                  4
												  单体电池最高电压                                              5
												  单体电池最低电压                                              6
												  充电机环境温度
												  充电导引电压													  8
												  BMS 需求电压                                                    9
												  BMS 需求电流                                                   10
												  充电模式                                                            11
												  BMS 充电电压测量值                                        12
												  BMS 充电电流测量值                                        13
												  估算剩余充电时间                                             14
											  	  充电接口温度探头 1 温度(接口 1 DC+)             15
												  充电接口温度探头 2 温度(接口 1 DC-)              16
												  充电接口温度探头 3 温度(接口 2 DC+)              17
												  充电接口温度探头 4 温度(接口 2 DC+)              18
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                                                  交流输出 A 相电压                                              19
												  交流输出 B 相电压                                             20
												  交流输出 C 相电压                                              21
												  交流输出 A 相电流                                              22
												  交流输出 B 相电流                                             23
												  交流输出 C 相电流                                              24
                                                  AB线间电压                                                         25
                                                  有功总电度低                                                      26
                                                  有功总电度高                                                     27



												  备用
												  ...
												  备用*/
	}dc;
	struct{
		short 		MX[48];		   /*充电输出 A 相电压
												  充电输出 B 相电压
												  充电输出 C 相电压
												  充电输出 A 相电流
												  充电输出 B 相电流
												  充电输出 C 相电流
												  充电导引电压
												  输出 PWM 占空比
												  充电接口温度探头 1 温度(接口 1 DC+)
											      充电接口温度探头 2 温度(接口 1 DC-)
												  充电接口温度探头 3 温度(接口 2 DC+)
												  充电接口温度探头 4 温度(接口 2 DC+)
												  备用
												  ...
												  备用*/
	}ac;
};

typedef struct // u_in_mx
{
		short MX[9];// A相充电电压
				// B相充电电压
				// C相充电电压
				// A相充电电流
				// B相充电电流
				// C相充电电流
				//当前充电电量
				//累计充电时长
				//预计剩余充电时间

}s_in_mx;  //电表数据;

typedef struct {
	unsigned char yx_dc_pf22[8];
	unsigned char yx_dc_pf23[8];
	unsigned char yx_ac_pf32[8];

} out_yx;


typedef struct
{
	char guntab; //充电接口标识
	out_yx  yx_data;
	union u_out_mx yc_data; //遥测输出
	s_in_mx  yc_in_data;//遥测输入，电能表数据
} charge_gun;
typedef struct
{
	int errcode[8];
	charge_gun   gun[8];
} can_data;

typedef int			(*Send2Cha)(unsigned char,GW_Can* pmsg);	//命令处理函数指针

typedef int			(*outData2Main)(unsigned char ,void*);	//输出数据到主控
typedef int (*BackResult)(unsigned char ,void* pdata);
typedef void (*callbackFun_log)(const char  *);
typedef struct
{
	int firm_id;			//公司编号
	char type; 				//1直流  2 交流
	unsigned char gunnum;//枪个数，最多8个
	int ctrlpw_type;//支持的功率控制方式  0 常规 1共充  2 功率调节
	char  devNo[8];//桩编号
	char can_ver[2];//版本号
	char cannum;//can端口个数
	Gun_Can_Info* pgun_info;//发送线程参数
	canlink *p_can[2];//每个can端口产生一个链表，其中每个节点生成一个接收线程，参数是节点数据：can通信地址和传输队列ID
	int qmegid[8];//消息队列标识值，用来接收接收线程得到的数据帧
	can_data* data2main;//枪数据（包括遥测、摇信、电能表输入数据）
    Send2Cha        send2cha;//输出帧到can硬件接口函数
    BackResult   StartCharge01;//充电启动完成函数接口
    BackResult   finStartCharge;//充电完成函数接口
    BackResult   finStopCharge;//充电停止完成函数接口
    outData2Main  outyx;//摇信输出接口
    outData2Main  outyc;//遥测输出接口
    callbackFun_log writelog;
  //  outData2Main  outBMS;//BMS数据输出接口
  //  outData2Main  outBMS;//BMS数据输出接口

} Para_Can; //传到can模块的参数

//初始化函数，pcan指向一个 para_can结构
int protocol_can_init(void * pcan); //返回0成功，1 失败
//启动充电函数guntab 充电接口标识, ctrlPW 1--启用，2--关闭。
int protocol_can_start_charge(u8 gunid,u8 ctrltype); //返回0成功，1 失败
//停止充电函数guntab 充电接口标识, cause 1-计费控制单元正常停止， 2-计费控制单元故障终止。
int protocol_can_stop_charge( u8 gunid,char stop_reason);
//int can_adjust_charge_pw(u8 gunid,u8 type,int value);
//int orderFormOther(u8 gunid,u8 type,void* pvalue,BackResult pfun);
int orderFormOther(u8 gunid,u8 type,int value,int time,BackResult pfun);//由外部模块调用的函数,BackResult pfun

#ifdef __cplusplus

}

#endif
#endif /* PROTOCOL_CAN_H_ */
